﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Linq;

namespace TMS
{
    
    public enum tipoEstado
    {
        Abierto = 0,
        PendienteVerificacion = 1,
        Cerrado = 2
    }
    public enum tipoImportancia
    {
        Alta = 0,
        Media = 1,
        Baja = 2
    }
    public enum tipoCriterio { 
        Aplicacion = 0,
        Modulo = 1,
        Estado = 2,
        Importancia = 3,
        FechaCreacion = 4,
        FechaCerrado = 5,
        Usuario = 6
    }
    public class Error
    {
        #region ATRIBUTOS

        private long _Id;
        private Aplicacion _Aplicacion;
        private Modulo _Modulo;
        private string _Descripcion;
        private tipoEstado _Estado;
        private tipoImportancia _Importancia;
        private Usuario _Usuario;
        private DateTime _FechaCreado;
        private DateTime _FechaCerrado;
        private List<ComentarioError> _LstComentarios;

        #endregion

        #region PROPERTIES

        public long Id
        {
            get { return _Id; }
            set { _Id = value; }
        }
        public Aplicacion Aplicacion
        {
            get { return _Aplicacion; }
            set { _Aplicacion = value; }
        }
        public Modulo Modulo
        {
            get { return _Modulo; }
            set { _Modulo = value; }
        }
        public string Descripcion
        {
            get { return _Descripcion; }
            set { _Descripcion = value; }
        }
        public tipoEstado Estado
        {
            get { return _Estado; }
            set { _Estado = value; }
        }
        public tipoImportancia Importancia
        {
            get { return _Importancia; }
            set { _Importancia = value; }
        }
        public Usuario Usuario
        {
            get { return _Usuario; }
            set { _Usuario = value; }
        }
        public DateTime FechaCreado
        {
            get { return _FechaCreado; }
            set { _FechaCreado = value; }
        }
        public DateTime FechaCerrado
        {
            get { return _FechaCerrado; }
            set { _FechaCerrado = value; }
        }
        public List<ComentarioError> LstComentarios
        {
            get { return _LstComentarios; }
            set { _LstComentarios = value; }
        }
        #endregion

        #region CONSTRUCTORES

        public Error()
        { }
        public Error(long pId, Aplicacion pAplicacion, Modulo pModulo, string pDescripcion, tipoImportancia pImportancia, Usuario pUsuario)
        {
            _Id = pId;
            _Aplicacion = pAplicacion;
            _Modulo = pModulo;
            _Descripcion = pDescripcion;
            _Estado = tipoEstado.Abierto;
            _Importancia = pImportancia;
            _Usuario = pUsuario;
            _FechaCreado = DateTime.Today;
        }
        #endregion

        #region METODOS

        public void newError() //Le pasa una nueva instancia de Error al manejador de XML correspondiente.
        {
            ErrorXMLManager.getInstancia().addError(this);
        }
        public void updateError() //Le pasa una actualizacion de un error contenida en una instancia de Error al manejador XML correspondiente.
        {
            ErrorXMLManager.getInstancia().updateError(this);
        }
        public void removeError() //Le pasa al manejador un Id al manejador XML para eliminar el error.
        {
            ErrorXMLManager.getInstancia().removeErrorById(this.Id); 
        }
        public void cerrarError() //Cierra un error.
        {
            ErrorXMLManager.getInstancia().cerrarError(this);
        }
        public static List<Error> getErrListByUserId(long pUsuId)
        {
            return ErrorXMLManager.getInstancia().getListByUserId(pUsuId);
        }
        public static Error getErrorById(long errId)
        {
            return ErrorXMLManager.getInstancia().getErrorById(errId);
        }

        public static List<ComentarioError> listarComentarios(long errId) //Le asigna al atributo _LstComentarios una lista de comentarios relacionados a esta instancia de Error por su Id.
        {
            return ErrorXMLManager.getInstancia().getListComments(errId);
        }
        public static long getUltimoId()
        {
            return ErrorXMLManager.getInstancia().getUltimoId();
        }
        public static List<Error> getListaErrByFechaCerrado(DateTime f1, DateTime f2)
        {
            List<Error> lstErr = new List<Error>();
            if (f1 != f2)
            {
                lstErr = ErrorXMLManager.getInstancia().getListByFechaCerrado(f1, f2);
            }
            return lstErr;
        }
        public static List<Error> getListaErrByFechaCreado(DateTime f1, DateTime f2)
        {
            List<Error> lstErr = new List<Error>();
            if (f1 != f2)
            {
                lstErr = ErrorXMLManager.getInstancia().getListByFechaCreado(f1, f2);
            }
            return lstErr;
        }
        public static List<Error> getListaErrByImportancia(string pImp)
        {
            return ErrorXMLManager.getInstancia().getListByImportancia(pImp);
        }
        public static List<Error> getListaErrByEstado(string pEst)
        {
            return ErrorXMLManager.getInstancia().getListByEstado(pEst);
        }
        public static List<Error> getListaErrByAppId(long pId)
        {
            return ErrorXMLManager.getInstancia().getListByAppId(pId);
        }
        public static List<Error> getListaErrByModId(long pId)
        {
            return ErrorXMLManager.getInstancia().getListByModId(pId);
        }
        public static List<float> getEstadByAppId(long pId, string pEst)
        {
            return ErrorXMLManager.getInstancia().getEstadisticaByAppId(pId, pEst);
        }
        public override string ToString()
        {
            return "Id: " + _Id + ", Importancia: " + _Importancia + ", Aplicacion: " + _Aplicacion.Nombre + ", Modulo: " + _Modulo.Nombre + ", Descripcion: " + _Descripcion + ", Ingresado: " + _FechaCreado;
        }
        #endregion

        
    } 
}